<?php
	// Lớp nền tảng của Fx_Data_Column, Fx_Data_Row, Fx_Grid_Table
	class Fx_Data_View extends Fx_Data_Serial
	{
		// Model (lớp dẫn xuất từ lớp st_model)
		protected $_model = null;
		// Tên lớp
		protected $_classes = array();
		// ID
		protected $_id = '';
		// Type, kiểu đối tượng
		protected $_type = '';
		// Tooltip
		protected $_tooltip = '';
		// Tiêu đề
		protected $_heading = '';
		// Dữ liệu
		protected $_data = '';
		// Dữ liệu định dạng hiển thị (chiều dài)
		protected $_width = 'auto';
		// Dữ liệu định dạng hiển thị (chiều cao)
		protected $_height = 'auto';
		// Có hiển thị hay không hiển thị
		protected $_visible = true;
		// Dữ liệu mô tả về đối tượng, vd: href, src...
		protected $_params = array();
		// Nếu định dạng hiển thị là một thẻ select hoặc checkbox hoặc radiobutton thì giá trị của data_view sẽ là tập hợp các option
		protected $_options = array();
		
		function __construct($data = array())
		{
			$this->__beforeInit();
			$this->__init($data);		
			$this->__afterInit();
		}
		
		// Sự kiện khi bắt đầu khởi tạo
		protected function __init($_data) 
		{
			return $this;
		}
		
		// Sự kiện trước khi khởi tạo
		protected function __beforeInit()
		{
			return $this;	
		}
		
		// Sự kiện sau khi khởi tạo
		protected function __afterInit()
		{
			return $this;	
		}
		
		// Model của Data View		
		public function setModel(&$_model = null)
		{
			$this->_model = $_model;
			return $this;
		}
		
		// Model của Data View
		public function & getModel()
		{
			return $this->_model;
		}
		
		// Thiết lập ID
		public function setId($_id = '')
		{
			if (is_string($_id) && !empty($_id)) 
			{
				$this->_id = $_id;	
			} else {
				$this->_id = 'colId_'.$this->_field.'-'.sha1(time());	
			}
			return $this;
		}
		
		// Lấy về ID
		public function getId()
		{
			return (string)$this->_id;	
		}
		
		// Thiết lập Type
		public function setType($_type = '')
		{
			if (is_string($_type) && !empty($_type)) 
			{
				$this->_type = $_type;	
			}
			return $this;
		}
		
		// Lấy về Type
		public function getType()
		{
			return (string)$this->_type;	
		}
		
		// Thiết lập tiêu đề cột
		public function setHeading($_heading = '')
		{
			if (is_string($_heading) && !empty($_heading)) 
			{
				$this->_heading = $_heading;	
			}
			return $this;
		}
		
		// Đối tượng có được hiển thị ra màn hình hay không
		public function isVisible()
		{
			return (boolean)$this->_visible;	
		}
		
		// Thiết lập hiển thị
		public function setVisible($visible = true)
		{
			if (is_bool($visible)) 
			{
				$this->_visible = $visible;	
			}
			return $this;
		}
		
		// Lấy về tiêu đề cột
		public function getHeading()
		{
			return (string)$this->_heading;	
		}
		
		// Thiết lập param
		public function setParam($name, $value)
		{
			if (is_string($name) && !empty($value)) 
			{
				$this->_params[$name] = $value;	
			}
			return $this;
		}
		
		// Lấy về param
		public function getParam($name)
		{
			if (isset($this->_params[$name])) 
			{
				return (string)$this->_params[$name];	
			}
			return null;
		}
		
		// Khởi tạo lại param
		public function resetParams()
		{
			$this->_params = array();
			return $this;	
		}
		
		// Thêm giá trị option
		public function addOptionValue($value, $autoGenId = true)
		{
			if (!empty($value)) 
			{
				if ($autoGenId) {
					$this->_options[$value] = $value;	
				} 
				else 
				{
					$this->_options[] = $value;	
				}
			}
			return $this;
		}
		
		// Lấy về giá trị option theo index hoặc khóa
		public function getOptionValue($index)
		{
			if (isset($this->_options[$index])) 
			{
				return (string)$this->_options[$index];	
			}
			return null;
		}
		
		// Khởi tạo lại các giá trị options
		public function resetOptions()
		{
			$this->_options = array();
			return $this;	
		}
		
		// Thiết lập tooltip cho cột
		public function setTooltip($_tooltip = '')
		{
			if (is_string($_tooltip) && !empty($_tooltip)) 
			{
				$this->_tooltip = $_tooltip;	
			}
			return $this;
		}
		
		// Lấy về gợi ý
		public function getTooltip()
		{
			return (string)$this->_tooltip;	
		}
		
		// Thiết lập dữ liệu hiện thời
		public function setData($_data = '')
		{
			if (is_string($_data) && !empty($_data)) 
			{
				$this->_data = $_data;	
			}
			return $this;
		}
		
		// Lấy về dữ liệu hiện thời
		public function getData()
		{
			return (string)$this->_data;	
		}

		// Thiết lập tên lớp
		public function addClass($_class = '')
		{
			if (is_string($_class) && !empty($_class)) 
			{
				$this->_classes[$_class] = $_class;	
			}
			return $this;
		}
		
		// Lấy về tập hợp tên lớp
		public function getClasses()
		{
			return (array)$this->_classes;
		}
		
		// Lấy về tên lớp
		public function getClassName()
		{
			return (string)implode(' ', $this->_classes);	
		}
		
		// Thiết lập class name
		public function setClassName($_className)
		{
			$classes = explode(' ', $_className);
			$this->_classes = $classes;
			return $this;
		}
		
		// Thiết lập chiều dài
		public function setWidth($_width = '100%')
		{
			if (!empty($_width)) 
			{
				$this->_width = $_width;	
			}
			return $this;	
		}
		
		// Lấy về chiều dài
		public function getWidth()
		{
			return (string)$this->_width;	
		}
		
		// Thiết lập chiều dài
		public function setHeight($_height = '25px')
		{
			if (!empty($_width)) 
			{
				$this->_height = $_height;	
			}
			return $this;	
		}
		
		// Lấy về chiều dài
		public function getHeight()
		{
			return (string)$this->_height;	
		}
		
		// Lấy về nội dung html
		public function getOutputHtml()
		{
			return '';	
		}
		
		// Sự kiện trước khi xuất ra html
		public function __beforeToHtml()
		{
			return $this;	
		}
		
		// Sự kiện sau khi xuất ra html
		public function __afterToHtml()
		{
			return $this;	
		}
		
		// Xuất ra html
		public function toHtml()
		{
			$this->__beforeToHtml();
			echo $this->getOutputHtml();
			$this->__afterToHtml();
			return $this;
		}
		
		// Lưu lại đối tượng vào bộ registry
		public function saveToRegistry($key = '')
		{
			if ($key == '')
			{
				$key = $this->getId();	
			}
			st_registry::getInstance()->register($key, $this, st_registry::REGISTRY_SERIALIZABLE);
			return $this;
		}
		
		// Lấy lại dữ liệu từ registry
		public function getDataFromRegistry($key = '')
		{
			if ($key == '') 
			{
				$key = $this->getId();
			}
			return st_registry::getInstance()->registry($key);
		}
		
		// Reset lại class
		public function resetClasses()
		{
			$this->_classes = array();
			return $this;
		}
											
	}
?>